import { BuildingType, CommandType, EntityType, MapSettingsType, TildeType, UnitType } from './Enums';
import { MainMapData50x50, Main2MapData50x50, Main3MapData50x50, Main4MapData50x50, Main5MapData50x50, Main6MapData50x50 } from './MapConstConfigs';

/**
 * 回合数上限
 */
export const RoundLimit = 200;

/**
 * 命令失败次数上限
 */
export const CommandFailLimit = 50;

/**
 * 代码执行异常次数上限
 */
export const CodeExecutionFailLimit = 10;

/**
 * 玩家初始经济
 */
export const InitRMB = 200;

/**
 * 士兵溅射伤害比例
 */
export const SplashDamageRatio = 0.5;

/**
 * 地图设置
 */
export const MapSettings: MapSettingsType = {
    basePosition: [
        { x: 2, y: 24 },
        { x: 47, y: 24 },
    ],
    playerColors: ['#D11515', '#145BDA'],
};

/**
 * 地图配置索引
 */
export const MapConfigs = {
    main: MainMapData50x50,
    main2: Main2MapData50x50,
    main3: Main3MapData50x50,
    main4: Main4MapData50x50,
    main5: Main5MapData50x50,
    main6: Main6MapData50x50,
};

/**
 * 地图1、2基地位置
 */
export const BasePosition1 = [
    { x: 2, y: 24 },
    { x: 47, y: 24 },
];

/**
 * 地图3基地位置
 */
export const BasePosition2 = [
    { x: 2, y: 47 },
    { x: 47, y: 2 },
];

/**
 * 地图4基地位置
 */
export const BasePosition3 = [
    { x: 6, y: 6 },
    { x: 43, y: 43 },
];

/**
 * 地图5基地位置
 */
export const BasePosition4 = [
    { x: 9, y: 40 },
    { x: 40, y: 9 },
];

/**
 * 地图6基地位置
 */
export const BasePosition6 = [
    { x: 9, y: 40 },
    { x: 40, y: 9 },
];

/**
 * 基地位置索引
 */
export const BasePositionConfigs = {
    main: BasePosition1,
    main2: BasePosition1,
    main3: BasePosition2,
    main4: BasePosition3,
    main5: BasePosition4,
    main6: BasePosition6,
};

/**
 * 单位属性配置
 * 定义每种单位类型的固定属性值
 */
export const UnitConfig = {
    [UnitType.soldier]: {
        /** 名字 */
        name: '士兵',
        /** 攻击力 */
        attack: 30,
        /** 移动速度 */
        speed: 1,
        /** 初始血量 */
        hp: 80,
        /** 攻击范围 */
        attackRange: 1,
        /** 生产成本 */
        cost: 25,
        /** 被击杀奖励 */
        killedAward: 15,
        /** 文本小图标 */
        icon: "⚔️",
    },
    [UnitType.collect]: {
        /** 名字 */
        name: '采集兵',
        /** 采集数量 */
        attack: 1,
        /** 移动速度 */
        speed: 1,
        /** 初始血量 */
        hp: 40,
        /** 采集范围 */
        attackRange: 1,
        /** 生产成本 */
        cost: 15,
        /** 被击杀奖励 */
        killedAward: 15,
        /** 文本小图标 */
        icon: "⛏️",
    },
    [UnitType.doctor]: {
        /** 名字 */
        name: '治疗兵',
        /** 治疗量 */
        attack: 10,
        /** 移动速度 */
        speed: 1,
        /** 初始血量 */
        hp: 50,
        /** 治疗范围 */
        attackRange: 1,
        /** 生产成本 */
        cost: 20,
        /** 被击杀奖励 */
        killedAward: 12,
        /** 文本小图标 */
        icon: "💊",
    },
    [UnitType.archer]: {
        /** 名字 */
        name: '弓箭手',
        /** 攻击力 */
        attack: 20,
        /** 移动速度 */
        speed: 1,
        /** 初始血量 */
        hp: 40,
        /** 攻击范围 */
        attackRange: 3,
        /** 生产成本 */
        cost: 30,
        /** 被击杀奖励 */
        killedAward: 18,
        /** 文本小图标 */
        icon: "🏹",
    },
    [UnitType.worker]: {
        /** 名字 */
        name: '建造兵',
        /** 建筑数量 */
        attack: 1,
        /** 移动速度 */
        speed: 1,
        /** 初始血量 */
        hp: 50,
        /** 建造范围 */
        attackRange: 1,
        /** 生产成本 */
        cost: 30,
        /** 被击杀奖励 */
        killedAward: 18,
        /** 文本小图标 */
        icon: "🪓",
    }
};

/**
 * 资源属性配置
 * 定义每种资源类型的固定属性值
 */
export const ResourceConfig = {
    [TildeType.energy]: {
        /** 名字 */
        name: '能源',
        /** 价值 */
        value: 3,
        /** 文本小图标 */
        icon: "⚡",
    },
    [TildeType.wood]: {
        /** 名字 */
        name: '木材',
        /** 价值 */
        value: 2,
        /** 文本小图标 */
        icon: "🌲",
    },
    [TildeType.stone]: {
        /** 名字 */
        name: '石材',
        /** 价值 */
        value: 2,
        /** 文本小图标 */
        icon: "🧱",
    },
    [TildeType.gold]: {
        /** 名字 */
        name: '黄金',
        /** 价值 */
        value: 6,
        /** 文本小图标 */
        icon: "💰",
    }
};

/**
 * 建筑属性配置
 * 定义每种建筑类型的固定属性值
 */
export const BuildingConfig = {
    [BuildingType.base]: {
        /** 名字 */
        name: '基地',
        /** 攻击力 */
        attack: 1,
        /** 初始血量 */
        hp: 600,
        /** 攻击范围 */
        attackRange: 10,
        /** 建造成本 */
        cost: 0,
        /** 被击杀奖励 */
        killedAward: 0,
        /** 文本小图标 */
        icon: "🕍",
    },
    [BuildingType.tower]: {
        /** 名字 */
        name: '防御塔',
        /** 攻击力 */
        attack: 30,
        /** 初始血量 */
        hp: 50,
        /** 攻击范围 */
        attackRange: 4,
        /** 建造成本 */
        cost: 100,
        /** 被击杀奖励 */
        killedAward: 100,
        /** 文本小图标 */
        icon: "🗼",
    },
    [BuildingType.wall]: {
        /** 名字 */
        name: "城墙",
        /** 攻击力 */
        attack: 0,
        /** 初始血量 */
        hp: 150,
        /** 攻击范围 */
        attackRange: 0,
        /** 建造成本 */
        cost: 200000,
        /** 被击杀奖励 */
        killedAward: 6,
        /** 文本小图标 */
        icon: "🌆",
    }
};

/**
 * 获取单位配置
 * @param unitType 单位类型
 * @returns 单位配置对象
 */
export function getUnitConfig(unitType: UnitType) {
    return UnitConfig[unitType];
}

/**
 * 获取建筑配置
 * @param buildingType 建筑类型
 * @returns 建筑配置对象
 */
export function getBuildingConfig(buildingType: BuildingType) {
    return BuildingConfig[buildingType];
}

/**
 * 获取资源配置
 * @param resourceType 资源类型
 * @returns 资源配置对象
 */
export function getResourceConfig(resourceType: TildeType) {
    return ResourceConfig[resourceType];
}

/**
 * 判断地块类型是否为资源地形
 * @param tildeType 地块类型
 * @returns 是否为资源地形
 */
export function isResourceTildeType(tildeType: TildeType): boolean {
    return (
        tildeType === TildeType.gold ||
        tildeType === TildeType.energy ||
        tildeType === TildeType.wood ||
        tildeType === TildeType.stone
    );
}

/**
 * 方向类型
 */
export const DirectionType = {
    up: [0, -1],
    down: [0, 1],
    left: [-1, 0],
    right: [1, 0],
};

/**
 * 玩家颜色
 */
export const ColorsConst = {
    logPlayer1Color: '#D11515', // 日志玩家1
    logPlayer2Color: '#145BDA', // 日志战玩家2
    logResultColor: '#FFFF05', // 日志战斗结果
};


// 实体类型名称映射表
export const ENTITY_TYPE_NAMES = {
    [EntityType.unit]: '单位',
    [EntityType.building]: '建筑',
    [EntityType.terrain]: '地形',
};

// 地形类型名称映射表
export const TERRAIN_NAMES = {
    [TildeType.flat]: '平地',
    [TildeType.hill]: '山丘',
    [TildeType.river]: '河流',
    [TildeType.gold]: '黄金矿',
    [TildeType.energy]: '能源矿',
    [TildeType.wood]: '木材',
    [TildeType.stone]: '石材',
};

// 命令类型名称常量
export const COMMAND_TYPE_NAMES = {
    [CommandType.init]: '初始化',
    [CommandType.end]: '结束',
    [CommandType.move]: '移动',
    [CommandType.attack]: '攻击',
    [CommandType.build]: '建造',
    [CommandType.swap]: '生产',
    [CommandType.heal]: '治疗',
    [CommandType.collect]: '采集',
};

// 实体角色名称常量
export const ENTITY_ROLE_NAMES = {
    attacker: '攻击者',
    attackTarget: '攻击目标',
    healer: '治疗者',
    healTarget: '治疗目标',
    swapper: '生产者',
    collector: '采集者',
    builder: '建造者',
    mover: '移动单位',
};

// 地形名称常量
export const TERRAIN_TYPE_NAMES = {
    unknown: '未知地形',
    hill: '山丘',
    flat: '平地',
    river: '河流',
};

// 通用名称常量
export const COMMON_NAMES = {
    unknownEntity: '未知实体',
    unknownUnit: '未知单位',
    unknownBuilding: '未知建筑',
    unknownTerrain: '未知地形',
    unknownType: '未知类型',
};

// 战斗状态名称常量
export const BATTLE_STATUS_NAMES = {
    init: '初始化',
    running: '运行中',
    end: '结束',
    unknown: '未知状态',
};
